package com.udg.goodmorning.tweet;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.os.SystemClock;
import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.PreferenceActivity;
import android.preference.RingtonePreference;
import android.util.Log;


/**
 * 設定画面<br>
 * アプリ起動時に表示される設定画面、各種設定を行う。
 *
 * @author Ippei Shimobou
 *
 */
public class PreferenceMenu extends PreferenceActivity implements
		OnSharedPreferenceChangeListener {
	private boolean OnOffState = false;

	// PendingIntentは、メンバ変数にしてしまうとcanselできないためコメントアウト by Shimobou
	//static PendingIntent sender = null;
	static AlarmManager am = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// pref画面の出力
		addPreferencesFromResource(R.xml.preferences);
	}

	@Override
	protected void onResume() {
		super.onResume();
		// Set up a listener whenever a key changes
		getPreferenceScreen().getSharedPreferences()
				.registerOnSharedPreferenceChangeListener(this);
		setSummary();
	}

	@Override
	protected void onPause() {
		super.onPause();
		// Unregister the listener whenever a key changes
		getPreferenceScreen().getSharedPreferences()
				.unregisterOnSharedPreferenceChangeListener(this);
	}

	/**
	 * 設定変更イベント<br>
	 * 変更された設定に応じた処理を行う。設定が変更されるたびにサービスを再実行する。
	 */
	@Override
	public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
			String key) {

		if (Utility.DEBUG)
			Log.v("TwakeCall", "onSharedPref in");


		/*[FIX ME]
		 *  調整中　BUG2つ
		 * 　・アカウントOFF時にアカウントの消去
		 * 　　→FILEを消しても、取得したPreferenceはなぜか、元のまま
		 * 　・アカウントを拾いにいっている最中にBACKを押すと死んじゃう。
		 *
		 */
		if (key.equals(Utility.KEY_TWITTER_ACCOUNT)){
			Boolean accountStat = sharedPreferences.getBoolean(key, false);

			/* ACCOUNT OFF -> ON */
			if(accountStat){
				/* Confirm Activity Call */
				SharedPreferences pref_token = getSharedPreferences("token", MODE_PRIVATE);
				String token = pref_token.getString("token", "");
				String tokenSecret = pref_token.getString("tokenSecret", "");

				// 未認証
				if (token.equals("") && tokenSecret.equals("")) {
					Intent callConfirm = new Intent(this,
						com.udg.goodmorning.tweet.TwitterLoginActivity.class);
					startActivity(callConfirm);
				}

				//cache clean
				pref_token = null;
			}else{
				/* ACCOUNT ON -> OFF */
//				String src = "/data/data/" + getPackageName() + "/shared_prefs/" + "token.xml";
//				File fp = new File(src);
//				if(fp.exists()){
//					fp.delete();
//				}
				/* TODO:  ファイルを消してもPreferenceは値に変化があるまで
				 * 		  メモリに保持したままのはず。値を変えた時点でファイルが
				 * 		  再度デフォルト値で作成され、メモリに保持する。・・・はず。
				 * 		  よって、Preferenceの値を初期化してやるべき。。 by Shimobou
				 */
			}
		}

		/* Set On_Off Changed Time */
		CheckBoxPreference checkbox_preference = (CheckBoxPreference) getPreferenceScreen()
				.findPreference(Utility.KEY_ONOFF);
		if (checkbox_preference.isChecked()) {
			SharedPreferences OnOffPref = getSharedPreferences("on_off_time",
					MODE_PRIVATE);
			SharedPreferences.Editor editor = OnOffPref.edit();

			/* Get time */
			editor.putString("on_time",
					Long.toString(System.currentTimeMillis()));
			editor.commit();
		}

		/* set AlarmManager */
		StartService();

	}

	/**
	 * Summaryをセットする
	 */
	public void setSummary() {
		ListPreference polltime = (ListPreference) getPreferenceScreen()
				.findPreference(Utility.KEY_TIME_LIST);
		polltime.setSummary(polltime.getValue() + "minite");

		CheckBoxPreference checkbox_preference = (CheckBoxPreference) getPreferenceScreen()
				.findPreference(Utility.KEY_ONOFF);
		RingtonePreference alarm_music_pref = (RingtonePreference) getPreferenceScreen()
				.findPreference(Utility.KEY_ALARM_TITLE);

		/* set OnOff Summary */
		if (checkbox_preference.isChecked()) {
			checkbox_preference.setSummary("ON");
			OnOffState = true;
		} else {
			checkbox_preference.setSummary("OFF");
			OnOffState = false;
		}

		/* set Alarm Summary */

	}

	/**
	 * WidgetServiceとポーリングイベントを設定する。<br>
	 * 設定された内容に応じ、WidgetServiceを実行する。
	 * ポーリングイベントが既にセットされている場合は、停止する。
	 */
	public void StartService() {
		ListPreference setTimePref = (ListPreference) getPreferenceScreen()
				.findPreference(Utility.KEY_TIME_LIST);
		long preftime = Long.valueOf(setTimePref.getValue());
		if (Utility.DEBUG)
			preftime = 1;
		setSummary();

		/* delete manager */
		// PendingIntentは、メンバ変数にしてしまうとcanselできないため毎回生成する by Shimobou
		Intent dummyIntent = new Intent(PreferenceMenu.this, Receiver.class);
		dummyIntent.setAction(Utility.START_SERVICE);
		PendingIntent sender = PendingIntent.getBroadcast(PreferenceMenu.this, 0,
				dummyIntent, 0);

		if (am != null) {
			am.cancel(sender);
		} else {
			/*
			Intent dummyIntent = new Intent(PreferenceMenu.this, Receiver.class);
			dummyIntent.setAction(Utility.START_SERVICE);
			sender = PendingIntent.getBroadcast(PreferenceMenu.this, 0,
					dummyIntent, 0);

			*/
			am = (AlarmManager) (PreferenceMenu.this
					.getSystemService(ALARM_SERVICE));
			am.cancel(sender);
		}

		if (OnOffState) {
			/* set manager */
			Intent intent = new Intent(PreferenceMenu.this, Receiver.class);
			intent.setAction(Utility.START_SERVICE);
			sender = PendingIntent.getBroadcast(PreferenceMenu.this, 0, intent,
					0);

			// TODO: 上記にてすでにAlarmManagerのオブジェクトは保障されているため、
			//       下記処理は不要   by Shimobou
			//am = (AlarmManager) (PreferenceMenu.this
			//		.getSystemService(ALARM_SERVICE));

			// ポーリングイベントをセット
			long interval = preftime * 1000 * 60;
			long firstTime = SystemClock.elapsedRealtime();
			am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
					interval, sender);
		}
		/* Widgetの更新 */
		Intent wsIntent = new Intent(this, WidgetService.class);
		startService(wsIntent);

	}
}
